#pragma once
#include<iostream>
#include<memory>
#include<mutex>
#include<condition_variable>

//namespace yangyi
//{
//	template <class T>
//	class shared_ptr;
//	
//	template <class T>
//	class weak_ptr;
//
//	template <class T>
//	class control_block
//	{
//	public:
//		T* _obj;
//		int _ref_count;
//		std::mutex _mutex;
//		std::condition_variable _condition;
//		control_block(T* obj) 
//			:_obj(obj){}
//		~control_block(){}
//	};
//
//	template <class T>
//	class shared_ptr
//	{
//	public:
//		shared_ptr()
//			:ptr_ctrl_block(nullptr)
//		{}
//		shared_ptr(T* ptr)
//		{
//			ptr_ctrl_block = new control_block<T>(ptr);
//		}
//
//	private:
//		control_block<T>* ptr_ctrl_block;
//	};
//
//	template <class T>
//	class weak_ptr
//	{
//	private:
//		control_block<T>* ptr_ctrl_block;
//	};
//}